/**
 * @file "jeu.h"
 * @author Margot FARGIER, FAURE Adrien
*/

#include <stdio.h>
#ifndef _JEU_H_
#define _JEU_H_
#include "personnage.h"
#include "terrain.h"
#include "ennemi.h"
#include "portail.h"


/**
 * @brief structure nécessaire au chargement du jeu
 * @var Personnage personnage
 * @var Terrain terrain
 * @var Ennemi * tabEnnemis
 * @var Portail tabPortails[2]
 * @var int nbEnnemis
*/
typedef struct
{
	Personnage personnage;
	Terrain terrain;
	Ennemi * tabEnnemis;
	Portail tabPortails[2];
	int nbEnnemis;
} Jeu;

/**
 * @brief Initialisation, d'une structure Jeu
 * @param[in-out] Jeu
 * @return none
*/
void jeuInit(Jeu *pJeu);

/**
 * @brief Destrution d'une variable jeu
 * @warning la variable jeu doit imperativement etre initialisée
 * @return none
*/
void jeuTestament(Jeu *);


/**
 * @brief Renvoie un pointeur sur le terrain
 * @warning la variable jeu doit imperativement etre initialisée
 * @return *Terrain
*/
const Terrain * jeuGetConstTerrain(const Jeu *);

/**
 * @brief Renvoie un pointeur sur le personnage
 * @warning la variable jeu doit imperativement etre initialisée
 * @return Personnage *
*/
const Personnage * jeuGetConstPersonnage(const Jeu *  );

/**
 * @brief Renvoie un pointeur sur portail 1
 *
 * @return Portail *
*/
const Portail * jeuGetConstPortail(const Jeu *, int);

/**
 * @brief retourne l'ennemi présent à l'indice i (passé en paramètre) du tableau d'ennemis du jeu passé en paramètres
 * @warning la variable jeu doit imperativement etre initialisée
 * @return const Ennemi *
*/
const Ennemi * jeuGetConstEnnemi(const Jeu *pJeu, int i);

/**
 * @brief retourne le nombre d'enemie presents dans le jeu
 * @return int
 * @param[in] const Jeu *
*/
int jeuGetNbEnnemis(const Jeu *);

/**
 * @brief modifie la variable nbEnnemi de Jeu
 * @param[in-out] Jeu *
 * @param [in] int
 */
void jeuSetNbEnnemis(Jeu *, int);

/**
 * @brief Gestion des deplacements du personnage en fonction des collisions.
 * @warning la variable jeu doit imperativement etre initialisée
 * @return none
*/
void collisions(Jeu *);

/**
 * @brief Detecte les colisions entre le personnage et le terrain
*/
int jeuColisionPersonnageTerrain(Jeu *);

/**
 * @brief Teleporte le personnage si il y a besoin
*/
void jeuPortailTeleportation(Jeu *);



void ennemisDeplacement(const Jeu * pJeu, int);


/**
 * @brief interprète les actions à faire selon les touches clavier tapées
 * @warning la variable jeu doit imperativement etre initialisée,ainsi que la chaine de caractère
 * @return none
*/
void jeuActionClavier(Jeu *, int );


/**
 * @brief Permet l'évolution du personnage sur le terrain
 * @warning la variable jeu doit imperativement etre initialisée
 * @return none
*/
void jeuEvolue(Jeu *);

#endif

